import { ts } from 'qvog-dsl';

import { rule } from 'qvog-dsl';

const SEVERITY = 2;
const DOC_PATH = 'docs/no-case-declarations-check.md';
const DESCRIPTION = 'Disallow lexical declarations in case clauses.';

export default rule<{ invalidPositions: ts.Node[] }>()
    .match((node): node is ts.CaseClause | ts.DefaultClause => {
        return ts.isCaseClause(node) || ts.isDefaultClause(node);
    })
    .when((node: ts.CaseClause | ts.DefaultClause, { props }): boolean => {
        props.invalidPositions = [];
        node.statements.forEach((statement) => {
            if (ts.isVariableStatement(statement)) {
                const declarationList = statement.declarationList;
                if (declarationList.flags & ts.NodeFlags.Let || declarationList.flags & ts.NodeFlags.Const) {
                    props.invalidPositions.push(statement);
                }
            } else if (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) {
                props.invalidPositions.push(statement);
            }
        });
        return props.invalidPositions.length > 0;
    })
    .report((node, { api, props }) => {
        props.invalidPositions.forEach((statement: ts.Node) => {
            api.report({
                location: api.getLocation(statement),
                severity: SEVERITY,
                description: DESCRIPTION,
                docPath: DOC_PATH,
            });
        });
    });
